\chapter{Лекция 2. Продолжение}

\section{Принципы ОО дизайна}

\paragraph{5 основных принципов объектно-ориентированного дизайна:}

\begin{itemize}
\item Единственности ответственности. Каждый класс должен выполнять одно конеретное действие, и не брать на себя большую ответственность.
Пример: Модель - Вид - Контроллер. Имеет смысл разделять данные и способ их получения, данные и способ их представления, данные и способы их преобразования. Из
простых объектов легче собирать новые решения, каждое изменение программы локализовано в одном объекте (как правило), наконец простые классы проще реализовывать.

\item Открытость абстракции, закрытость реализация. Известные в ООП концепции интерфейсов и инкапсуляции. Абстракция должна быть открыта для реализации, а реализация
закрыта от изменения.

\item Принцип замещения Лисков. Известный пример про прямоугольник и квадрат и в каком отношении они находятся.

\item Разделение интерфейсов. Не нужно мешать интерфейсы в одну кучу. Класс может реализовывать несколько интерфейсов при необходимости, но это не повод объединять
сами интерфейсы вместе. Т. е. каждый интерфейс должен быть минимален и не содержать в себе больше чем необходимо.

\item Принцип обращения зависимостей. Опирайтесь на интерфейсы, а не на реализации (создаешь $ArrayList$, а используешь его как $List$, создаешь $HashMap$, а
используешь $Map$), такой подход позволит быстро сменить одну реализацию на другую почти не изменяя программу.
\end{itemize}